package tsing.javase.annotation;

import java.lang.reflect.Field;

/**
 * @Author Tsing/吴清平
 * @Date 2022/10/9 13:45
 * @Version 1.0
 *
 * 自定义注解使用示例
 */
public class AnnotationDemo {
    public static void main(String[] args) {

        Student student = new Student().builder().age(18).name("Tsing").mobile("155813682").build();
        try {
            System.out.println(validate(student));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

  public static String validate(Object object) throws IllegalAccessException {
      // 首先通过反射获取object对象的类有哪些字段
      // 对本文来说就可以获取到Student类的mobile属性
      Field[] fields  = object.getClass().getDeclaredFields();
      //for循环逐个字段校验，看哪个字段标了注解
      for (Field field : fields) {
          // if判断：检查该字段上有没有标注了@Length注解
          if(field.isAnnotationPresent(Length.class)){
              Length length = field.getAnnotation(Length.class);
              field.setAccessible(true); //设置反射时能访问到私有变量
              int value = ((String) field.get(object)).length();
              // 将字段的实际值和注解上做标示的值进行比对
              if(value <length.min() || value > length.max()){
                  return length.message();
              }
          }
      }
      return null;
  }
}
